﻿#define TODO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.NetworkInformation;
using System.Net;
using System.Net.Sockets;
using System.Xml.Serialization;
using System.Xml;
using System.IO;
using System.Diagnostics;

namespace PEMS.Common
{
    /// <summary>
    /// Lehetséges osztályzatok felsorolása
    /// </summary>
    public enum ErdemjegyEnum
    {
        meg_nem_vizsgazott,
        nem_jelent_meg,
        elegtelen,
        elegseges,
        kozepes,
        jo,
        jeles,
    }

    /// <summary>
    /// Lehetséges aláírások felsorolása
    /// </summary>
    public enum AlairasEnum
    {
        nincs_beallitva,
        alairva,
        megtagadva,
    }

    /// <summary>
    /// csak üzeneteket közvetít
    /// </summary>
    public class N_msg
    {
        public List<string> msg { get; set; }

        public N_msg()
        {
            msg = new List<string>();
        }
    }

    /// <summary>
    /// adatokat is tud közvetíteni
    /// </summary>
    public class N_1 : N_msg
    {
        public Dictionary<string,string> strings { get; set; }
        public Dictionary<string, bool> bools { get; set; }
        public List<List<string>> rows { get; set; }
        public Dictionary<string, int> ints { get; set; }

        public N_1()
            : base()
        {
            strings = new Dictionary<string, string>();
            bools = new Dictionary<string, bool>();
            rows = new List<List<string>>();
            ints = new Dictionary<string, int>();
        }
    }


    /// <summary>
    /// Erdemjegyet is tud közvetíteni
    /// </summary>
    public class N_VizsgaJegyBeiras : N_1
    {
        public ErdemjegyEnum vjegy { get; set; }

        public N_VizsgaJegyBeiras()
            : base()
        {

        }
    }

    /// <summary>
    /// alairas erteket is tud közvetíteni
    /// </summary>
    public class N_AlairasBeallitas : N_1
    {
        public AlairasEnum alairasErtek { get; set; }

        public N_AlairasBeallitas()
            : base()
        {

        }
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// <summary>
    /// A programok ezen keresztül írják a logot
    /// ha nincs megadva file, a log a Visual Studio output ablakában látszik 
    /// </summary>
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public static class Log
    {
        /// <summary>
        /// a log írása
        /// </summary>
        /// <param name="s">ezt írjuk fájlba</param>
        /// <param name="srclineappend">a forráskód sorát hozzáírjuk-e</param>
        public static void logToFile(String s, bool srclineappend)
        {
            try
            {
                StackFrame stackFrame = new StackFrame(1, true);

                string file = Path.GetFileName(stackFrame.GetFileName().ToString());
                int line = stackFrame.GetFileLineNumber();
                if (srclineappend)
                    Trace.WriteLine(DateTime.Now.ToString()+ " " + s + " " + file + ": " + line);
                else
                    Trace.WriteLine(DateTime.Now.ToString() + " " + s);
                Trace.Flush();
            }
            catch { Console.WriteLine("Hiba logolas kozben"); }
        }
        /// <summary>
        /// Rendelkezünk, hogy a trace fájlba is írjon
        /// a log a futtatjató program (exe) mellett jön létre
        /// </summary>
        /// <param name="logfilename">a logfile neve</param>
        public static void setLogFile(string logfilename)
        {
            TextWriterTraceListener tr = new TextWriterTraceListener(System.IO.File.CreateText(logfilename));
            Debug.Listeners.Add(tr);
        }
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// <summary>
    /// serializálható Dictionary, hogy tudjuk fájlba írni
    /// </summary>
    /// <typeparam name="TKey">TKey</typeparam>
    /// <typeparam name="TValue">TValue</typeparam>
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    [XmlRoot("dictionary")]
    public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
    {
        #region IXmlSerializable Members
        /// <summary>
        /// GetSchema
        /// </summary>
        /// <returns>null</returns>
        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }
        /// <summary>
        /// ReadXml
        /// </summary>
        /// <param name="reader">XmlReader param</param>
        public void ReadXml(System.Xml.XmlReader reader)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
            
            bool wasEmpty = reader.IsEmptyElement;
            reader.Read();

            if (wasEmpty)
                return;

            while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
            {
                reader.ReadStartElement("item");
                reader.ReadStartElement("key");

                TKey key = (TKey)keySerializer.Deserialize(reader);
                reader.ReadEndElement();
                reader.ReadStartElement("value");

                TValue value = (TValue)valueSerializer.Deserialize(reader);
                reader.ReadEndElement();

                this.Add(key, value);
                reader.ReadEndElement();

                reader.MoveToContent();
            }
            reader.ReadEndElement();
        }


        /// <summary>
        /// WriteXml
        /// </summary>
        /// <param name="writer">XmlWriter param</param>
        public void WriteXml(System.Xml.XmlWriter writer)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));

            foreach (TKey key in this.Keys)
            {
                writer.WriteStartElement("item");
                writer.WriteStartElement("key");

                keySerializer.Serialize(writer, key);
                writer.WriteEndElement();

                writer.WriteStartElement("value");
                TValue value = this[key];

                valueSerializer.Serialize(writer, value);
                writer.WriteEndElement();

                writer.WriteEndElement();
            }
        }
        #endregion
    }

    
}
